package Thread_study.thread_synchronized_code;

public class Account {
    private String cardId;
    private double money;

    public Account() {
    }

    public Account(String cardId, double money) {
        this.cardId = cardId;
        this.money = money;
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    // 对于静态方法建议使用字节码(类名.class)对象作为锁对象
//    public static void run(){
//        synchronized (Account.class){
//
//        }
//    }
    /**
     *  小明 小红
     */
    public void drawMoney(double money) {
        // 0.先获取是谁来取钱
        String name = Thread.currentThread().getName();
        // 同步代码块
        // 小明 小红
        // 锁对象不能唯一,否则会影响其他线程的执行,规范上使用共享资源作为锁对象
        // 对于实例方法建议使用this作为锁对象
        // 对于静态方法建议使用字节码(类名.class)对象作为锁对象
        // this == acc 共享账户
        synchronized (this) {
            // 1.判断账户是否够钱
            if (this.money >= money) {
                // 2.取钱
                System.out.println(name + "来取钱成功,吐出" + money);
                // 3.更新余额
                this.money -= money;
                System.out.println(name + "取钱后:" + this.money);
            } else {
                // 4.余额不足
                System.out.println(name + "来取钱,余额不足");
            }
        }

    }
}
